//!文件操作
use std::fs::File;
use std::io::ErrorKind;
use std::io::Read;
use std::io::Write;
use std::io::Result;
use std::fs::OpenOptions;
use std::fs;
//复制文件
#[test]
pub fn copy_file(){
    //函数用于以只读模式打开一个已经存在的文件，如果文件不存在，则会抛出一个错误。如果文件不可读，那么也会抛出一个错误
    let r: Result<File> = File::open(r"C:\Users\mdjro\Desktop\demo.png");
    let mut size = 0_u32;
    match r {
        Ok(mut f) => {
            //创建文件，创建一个文件并返回创建的文件句柄。如果文件已经存在，则会内部调用 open() 打开文件。如果创建失败，比如目录不可写，则会抛出错误
            let mut write_f = File::create(r"C:\Users\mdjro\Desktop\demo_copy.png").unwrap();
            let mut buffer:[u8; 1024] = [0u8; 1024]; //缓冲区
            loop {
                //读入缓冲区
                let len = f.read(&mut buffer).unwrap();
                //写
                write_f.write(&buffer[0..len]).unwrap();
                size += len as u32;
                if len < buffer.len() {
                    break;
                }
            }
            write_f.flush();
        },
        Err(e) =>{
            match e.kind() {
                ErrorKind::NotFound => {
                    println!("文件不存在")
                },
                _ =>{
                    panic!("{}", e);
                }
            }
        }
    }
    println!("字节数:{}", size);
}

//注意： write_all() 方法并不会在写入结束后自动写入换行符 \n。
#[test]
pub fn write_all_demo(){

    let mut file = File::create("data.txt").unwrap();
    file.write_all("你好啊！hello world!".as_bytes()).unwrap();
    file.write_all("你好啊！hello world!".as_bytes()).unwrap();

}
//读取文件 read_to_string() 函数用于从一个文件中读取所有剩余的内容并转换为字符串。
#[test]
pub fn read_demo(){

    let mut file = std::fs::File::open("data.txt").unwrap();
    let mut contents = String::new();
    file.read_to_string(&mut contents).unwrap();
    print!("{}", contents);
}

// 当文件的模式设置为 追加 之后，写入文件的内容就不会代替原先的旧内容而是放在旧内容的后面。
#[test]
pub fn append_demo(){
    let mut file = OpenOptions::new().append(true).open("data.txt").expect(
        "cannot open file");
    file.write_all("www.twle.cn".as_bytes()).expect("write failed");
    file.write_all("\n简单教程".as_bytes()).expect("write failed");
    file.write_all("\n简单编程".as_bytes()).expect("write failed");
    println!("数据追加成功");
}

//删除文件
#[test]
pub fn delete_demo(){
    fs::remove_file("data.txt").expect("could not remove file");
    println!("file is removed");
}